#ifndef ANNUAIRE_HH
#define ANNUAIRE_HH

#include <string>
#include <iostream>
#include <vector>
#include<iterator>

using namespace std;
class Annuaire {
public:
	/***********************************************************
	 *		Structure de donnee 			   *
	 **********************************************************/
	typedef long time_t;
	typedef vector<string> repondeur;
	typedef vector<string> messagerie;

	struct client {
		int num;
		char* adresse;
		bool estMobile;
		int typeAbonnement;
		char* infoComptable;
		bool repondeurActif;
		bool messagerieActive;
		bool transfertActif;
		int consomme;
		repondeur rep;
		messagerie sms;
		int numTransfert;
		int estConnecte;
	};

	struct ligneHistorique {
		time_t date;
		int appelant;
		int appele;
		int duree;
	};

private:
	vector<struct client> listeClient;
	vector<struct ligneHistorique> historique;

	
	static Annuaire *singleton;
	Annuaire();
public:
	//Constructeur
	static Annuaire* getInstance();
	//Destructeur
   	virtual ~Annuaire();

	int getSize();
	/***********************************************************
	 * 						Gestion Compte					   *
	 **********************************************************/
	client initStructClient();

	vector<client> getClients();

	/*
	 * Permet d'ajouter un nouveau compte client dans l'annuaire.
	 */
	void ajouter(struct client _compteClient);

	/*
	 * Permet de supprimer un compte client de l'annuaire a partir du numero de telephone.
	 */
	void supprimer(int _num);

	/*
	 * Permet de modifier les informations d'un compte client de l'annuaire.
	 */
	void modifier(int _ancienNum, struct client _compteClient);

	/*
	 * Permet de rechercher un numero de telephone dans l'annuaire.
	 * 		- si le numero n'existe pas une exception est levee.
	 * 		- si un transfert d'appel est disponible le numero correspondant au transfert est retourne.		
	 * 		- sinon retourne le numero de telephone.
	 */
	int rechercher(int _num);

	/*
	 * Permet de r�cup�rer un compte client � partir de son num�ro de t�l�phone.
	 */
	client recupererCompteClient(int _num);
	
	/*
	 * Permet de savoir si l'utilisateur est conncet� au r�seau
	 */
	int getEstConnecte(int _num);
	

	/***********************************************************
	 * 						Gestion Historique				   *
	 **********************************************************/
	/*
	 * Service permettant d'ajouter une ligne dans l'historique
	 */
	void ajouterLigneHistorique(struct ligneHistorique _lh);

	/*
	 * Service permettant d'effacer l'historique en ne gardant que les informations du mois courant.
	 */
	void razHistorique();

	/*
	 * Service permettant de recuperer le montant total d'une facture pour un abonne et un mois donnes.
	 */
	int montantFacture(int _num);

	/*
	 * Service retournant l'ensemble des appels d'un abonne pour un mois donne.
	 */
	vector<struct ligneHistorique> factureDetaillee(int _num);
};
#endif
